package dm.bsi;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;

import algo.LoadBalance;
import dm.service.Manager;
import indi.zjh.dp.db.Session;

public class MSSDeployment extends Deployment {
	protected int expectedMasterCount = 0;
	protected int expectedSlaveCount = 0;
	protected int expectedSentinelCount = 0;
	
	/**
	 * 处理容器
	 */
	public void processContainer(Session session) throws Exception
	{
//		// 获取关联的Service对象
//		Service service = this.getService(session);
//		
//		// 检测服务是否有异常
//		Manager manager = null;
//		if(service.getCatalog() == Service.CATALOG_REDIS)
//		{
//			manager = new RedisManager();
//		}
//		
//		if(!manager.isNormal(session, this, service))
//		{
//			return;
//		}
//		
//		
//		
//		
//		// 获取Service关联的容器
//		long[] containerIds = service.getContainers().getIds();
//		ArrayList<Container> masterContainer = new ArrayList<Container>();
//		ArrayList<Container> slaveContainer = new ArrayList<Container>();
//		ArrayList<Container> sentinelContainer = new ArrayList<Container>();
//		
//		// 遍历Container, 检测状态
//		for(int i = 0; i < containerIds.length; ++i)
//		{
//			Container container = (Container)session.getById(Container.class, containerIds[i]);
//			// 容器正常运行
//			if(container.isRunning(session))
//			{
//				if(container.getRole() == Container.ROLE_MASTER)
//				{
//					masterContainer.add(container);
//				}
//				else if(container.getRole() == Container.ROLE_SLAVE)
//				{
//					slaveContainer.add(container);
//				}
//				else if(container.getRole() == Container.ROLE_SENTINEL)
//				{
//					sentinelContainer.add(container);
//				}
//			}
//			// 容器挂掉
//			else
//			{
//				if(container.getState() == Container.NOT_RUNNING)
//				{
//					container.destory(session, service);
//				}
//			}
//		}
//
//		
//		
//		// 获取准备就绪的服务器节点
//		Node[] nodes = Node.listReadyNodes(session);
//		if(nodes.length == 0)
//		{
//			Log.failure(session, this, "当前没有准备就绪的服务器节点, 部署容器被中断");
//			return;
//		}
//		
//		// 获取镜像
//		Image image = this.getImage(session);
//		// 判断主节点的个数, 并且启动
//		if(masterContainer.size() == 0)
//		{
//			Node selectedNode = LoadBalance.getIdlestNode(nodes);
//			selectedNode.downloadImage(session, image);
//			Container newContainer = new Container();
//			HashMap<String, String> env = new HashMap<String, String>();
//			env.put("ROLE", "MASTER");
//			newContainer.setRole(Container.ROLE_MASTER);
//			newContainer.start(session, this, selectedNode, image, true, env);
//			Service.agentUpdate(session);
//			Log.info(session, this, "启动master节点, node="+selectedNode+", container="+newContainer);
//			return;
//		}
//		
//		// 判断从节点的个数, 并且启动
//		if(slaveContainer.size() < this.expectedSlaveCount)
//		{
//			Node selectedNode = LoadBalance.getIdlestNode(nodes);
//			selectedNode.downloadImage(session, image);
//			Container newContainer = new Container();
//			HashMap<String, String> env = new HashMap<String, String>();
//			env.put("ROLE", "SLAVE");
//			env.put("MASTER_HOST", masterContainer.get(0).getNode(session).getIp());
//			env.put("MASTER_PORT", masterContainer.get(0).getDockerPort() + "");
//			newContainer.setRole(Container.ROLE_SLAVE);
//			newContainer.start(session, this, selectedNode, image, true, env);
//			Log.info(session, this, "启动slave节点, node="+selectedNode+", container="+newContainer);
//			return;
//		}
//		
//		// 判断sentinel节点的个数, 并且启动
//		if(sentinelContainer.size() < this.expectedSentinelCount)
//		{
//			Node selectedNode = LoadBalance.getIdlestNode(nodes);
//			selectedNode.downloadImage(session, image);
//			Container newContainer = new Container();
//			HashMap<String, String> env = new HashMap<String, String>();
//			env.put("ROLE", "SENTINEL");
//			env.put("MASTER_HOST", masterContainer.get(0).getNode(session).getIp());
//			env.put("MASTER_PORT", masterContainer.get(0).getDockerPort() + "");
//			newContainer.setRole(Container.ROLE_SENTINEL);
//			newContainer.start(session, this, selectedNode, image, true, env);
//			Log.info(session, this, "启动sentinel节点, node="+selectedNode+", container="+newContainer);
//			return;
//		}
	}
	
	public static String toDictString(Field f)
	{
		if(f.getName().equals("expectedMasterCount"))
		{
			return "Master容器节点个数";
		}
		else if(f.getName().equals("expectedSlaveCount"))
		{
			return "Slave容器节点个数";
		}
		else if(f.getName().equals("expectedSentinelCount"))
		{
			return "Sentinel容器节点个数";
		}

		return Deployment.toDictString(f);
	}

	public int getExpectedMasterCount() {
		return expectedMasterCount;
	}

	public void setExpectedMasterCount(int expectedMasterCount) {
		this.expectedMasterCount = expectedMasterCount;
	}

	public int getExpectedSlaveCount() {
		return expectedSlaveCount;
	}

	public void setExpectedSlaveCount(int expectedSlaveCount) {
		this.expectedSlaveCount = expectedSlaveCount;
	}

	public int getExpectedSentinelCount() {
		return expectedSentinelCount;
	}

	public void setExpectedSentinelCount(int expectedSentinelCount) {
		this.expectedSentinelCount = expectedSentinelCount;
	}

	@Override
	public String toString() {
		return "MSSDeployment [expectedMasterCount=" + expectedMasterCount + ", expectedSlaveCount="
				+ expectedSlaveCount + ", expectedSentinelCount=" + expectedSentinelCount + ", name=" + name
				+ ", description=" + description + ", hostPort=" + hostPort + ", secondHostPort=" + secondHostPort
				+ ", containerPort=" + containerPort + ", curContainerPort=" + curContainerPort + ", curId=" + curId
				+ ", mode=" + mode + ", tryCount=" + tryCount + ", service=" + service + ", image=" + image + ", _id="
				+ _id + ", _v=" + _v + "]";
	}
	
	
}
